1. Technical Field
The present disclosure relates to obfuscating a computer program, and more specifically to obfuscating data and instruction segments of a computer program.
2. Introduction
When compiling a computer program, a standard compiler will place the data and instructions for that computer program into distinct blocks. Because these blocks are logically organized, the computer can execute the instructions by running line after line of commands from the instruction blocks and retrieving necessary data from neatly organized data blocks. Unfortunately, these neatly organized and predictably laid out blocks of instructions and data are exploited by reverse engineers.
Attempts to reverse engineer a software program typically rely on one or both of two primary techniques: static analysis and dynamic analysis. Some static techniques identify specific sections of code and perform a linear sweep of the code section, line upon line, to disassemble the code from machine code to assembler. Static analysis can be quite effective at reverse engineering programs, but rely upon specific assumptions about the compiled code to correctly perform the reverse engineering. When these assumptions fail, reverse engineers are then forced to employ dynamic analysis, observing the inputs and outputs of the program and drawing inferences about the underlying code to either attempt to build an equivalent piece of code or understand and/or modify the functions of the code.
By using static and dynamic techniques to reverse engineer software programs, reverse engineers can develop software to mimic or replace previously developed software. In some cases, this new software fails to completely emulate the original software, while in other cases, attackers insert malicious code or functionality in reverse engineered software. For these and other reasons, software developers wish to protect their code by preventing unauthorized duplication, modification, or other attacks on their software.